public class MinimumOperationsToReduceXtoZero {
    // 逆向思维(正难则反)
    // 假如把数组分为 3 个区域 a b c(代表每个区域元素总和)
    // 则 a + b + c = total
    // 现在要找最短的 a + c = x
    // 反过来就是找最长的 b = total - x
    // 即寻找最长数组之和等于 total - x
    public int minOperations(int[] nums, int x) {
        int total = 0;
        int n = nums.length;
        for (int e : nums) {
            total += e;
        }

        // 寻找最长子串之和 sum 等于 target
        int target = total - x;
        // 注意，因为是 减 运算，所以有可能导致 target < 0
        // 窗口内元素之和 < 0, 但所给元素又没有负数, 因此这是不可能存在的情况, 直接返回 -1
        if (target < 0) {
            return -1;
        }
        int sum = 0;

        int left = 0, right = 0;
        int len = -1;
        while (right < n) {
            // 进窗口
            sum += nums[right];
            right++;
            while (sum > target) {
                sum -= nums[left];
                left++;
            }
            if (sum == target) {
                len = Math.max(len, right - left);
            }
        }
        if (len == -1) {
            return len;
        }
        return n - len;
    }
}
